/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tubosmonterrey.cotizador.sql;

import com.tubosmonterrey.cotizador.sql.exceptions.NonexistentEntityException;
import com.tubosmonterrey.cotizador.sql.exceptions.PreexistingEntityException;
import com.tubosmonterrey.cotizador.tb.Tbproductos;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import com.tubosmonterrey.cotizador.tb.TbcotizacionPos;
import java.util.ArrayList;
import java.util.Collection;
import com.tubosmonterrey.cotizador.tb.TbcotizacionTmpPos;

/**
 *
 * @author rsoberanis
 */
public class TbproductosJpaController implements Serializable {

    public TbproductosJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Tbproductos tbproductos) throws PreexistingEntityException, Exception {
        if (tbproductos.getTbcotizacionPosCollection() == null) {
            tbproductos.setTbcotizacionPosCollection(new ArrayList<TbcotizacionPos>());
        }
        if (tbproductos.getTbcotizacionTmpPosCollection() == null) {
            tbproductos.setTbcotizacionTmpPosCollection(new ArrayList<TbcotizacionTmpPos>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Collection<TbcotizacionPos> attachedTbcotizacionPosCollection = new ArrayList<TbcotizacionPos>();
            for (TbcotizacionPos tbcotizacionPosCollectionTbcotizacionPosToAttach : tbproductos.getTbcotizacionPosCollection()) {
                tbcotizacionPosCollectionTbcotizacionPosToAttach = em.getReference(tbcotizacionPosCollectionTbcotizacionPosToAttach.getClass(), tbcotizacionPosCollectionTbcotizacionPosToAttach.getTbcotizacionPosPK());
                attachedTbcotizacionPosCollection.add(tbcotizacionPosCollectionTbcotizacionPosToAttach);
            }
            tbproductos.setTbcotizacionPosCollection(attachedTbcotizacionPosCollection);
            Collection<TbcotizacionTmpPos> attachedTbcotizacionTmpPosCollection = new ArrayList<TbcotizacionTmpPos>();
            for (TbcotizacionTmpPos tbcotizacionTmpPosCollectionTbcotizacionTmpPosToAttach : tbproductos.getTbcotizacionTmpPosCollection()) {
                tbcotizacionTmpPosCollectionTbcotizacionTmpPosToAttach = em.getReference(tbcotizacionTmpPosCollectionTbcotizacionTmpPosToAttach.getClass(), tbcotizacionTmpPosCollectionTbcotizacionTmpPosToAttach.getTbcotizacionTmpPosPK());
                attachedTbcotizacionTmpPosCollection.add(tbcotizacionTmpPosCollectionTbcotizacionTmpPosToAttach);
            }
            tbproductos.setTbcotizacionTmpPosCollection(attachedTbcotizacionTmpPosCollection);
            em.persist(tbproductos);
            for (TbcotizacionPos tbcotizacionPosCollectionTbcotizacionPos : tbproductos.getTbcotizacionPosCollection()) {
                Tbproductos oldProductoOfTbcotizacionPosCollectionTbcotizacionPos = tbcotizacionPosCollectionTbcotizacionPos.getProducto();
                tbcotizacionPosCollectionTbcotizacionPos.setProducto(tbproductos);
                tbcotizacionPosCollectionTbcotizacionPos = em.merge(tbcotizacionPosCollectionTbcotizacionPos);
                if (oldProductoOfTbcotizacionPosCollectionTbcotizacionPos != null) {
                    oldProductoOfTbcotizacionPosCollectionTbcotizacionPos.getTbcotizacionPosCollection().remove(tbcotizacionPosCollectionTbcotizacionPos);
                    oldProductoOfTbcotizacionPosCollectionTbcotizacionPos = em.merge(oldProductoOfTbcotizacionPosCollectionTbcotizacionPos);
                }
            }
            for (TbcotizacionTmpPos tbcotizacionTmpPosCollectionTbcotizacionTmpPos : tbproductos.getTbcotizacionTmpPosCollection()) {
                Tbproductos oldProductoOfTbcotizacionTmpPosCollectionTbcotizacionTmpPos = tbcotizacionTmpPosCollectionTbcotizacionTmpPos.getProducto();
                tbcotizacionTmpPosCollectionTbcotizacionTmpPos.setProducto(tbproductos);
                tbcotizacionTmpPosCollectionTbcotizacionTmpPos = em.merge(tbcotizacionTmpPosCollectionTbcotizacionTmpPos);
                if (oldProductoOfTbcotizacionTmpPosCollectionTbcotizacionTmpPos != null) {
                    oldProductoOfTbcotizacionTmpPosCollectionTbcotizacionTmpPos.getTbcotizacionTmpPosCollection().remove(tbcotizacionTmpPosCollectionTbcotizacionTmpPos);
                    oldProductoOfTbcotizacionTmpPosCollectionTbcotizacionTmpPos = em.merge(oldProductoOfTbcotizacionTmpPosCollectionTbcotizacionTmpPos);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findTbproductos(tbproductos.getId()) != null) {
                throw new PreexistingEntityException("Tbproductos " + tbproductos + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Tbproductos tbproductos) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Tbproductos persistentTbproductos = em.find(Tbproductos.class, tbproductos.getId());
            Collection<TbcotizacionPos> tbcotizacionPosCollectionOld = persistentTbproductos.getTbcotizacionPosCollection();
            Collection<TbcotizacionPos> tbcotizacionPosCollectionNew = tbproductos.getTbcotizacionPosCollection();
            Collection<TbcotizacionTmpPos> tbcotizacionTmpPosCollectionOld = persistentTbproductos.getTbcotizacionTmpPosCollection();
            Collection<TbcotizacionTmpPos> tbcotizacionTmpPosCollectionNew = tbproductos.getTbcotizacionTmpPosCollection();
            Collection<TbcotizacionPos> attachedTbcotizacionPosCollectionNew = new ArrayList<TbcotizacionPos>();
            for (TbcotizacionPos tbcotizacionPosCollectionNewTbcotizacionPosToAttach : tbcotizacionPosCollectionNew) {
                tbcotizacionPosCollectionNewTbcotizacionPosToAttach = em.getReference(tbcotizacionPosCollectionNewTbcotizacionPosToAttach.getClass(), tbcotizacionPosCollectionNewTbcotizacionPosToAttach.getTbcotizacionPosPK());
                attachedTbcotizacionPosCollectionNew.add(tbcotizacionPosCollectionNewTbcotizacionPosToAttach);
            }
            tbcotizacionPosCollectionNew = attachedTbcotizacionPosCollectionNew;
            tbproductos.setTbcotizacionPosCollection(tbcotizacionPosCollectionNew);
            Collection<TbcotizacionTmpPos> attachedTbcotizacionTmpPosCollectionNew = new ArrayList<TbcotizacionTmpPos>();
            for (TbcotizacionTmpPos tbcotizacionTmpPosCollectionNewTbcotizacionTmpPosToAttach : tbcotizacionTmpPosCollectionNew) {
                tbcotizacionTmpPosCollectionNewTbcotizacionTmpPosToAttach = em.getReference(tbcotizacionTmpPosCollectionNewTbcotizacionTmpPosToAttach.getClass(), tbcotizacionTmpPosCollectionNewTbcotizacionTmpPosToAttach.getTbcotizacionTmpPosPK());
                attachedTbcotizacionTmpPosCollectionNew.add(tbcotizacionTmpPosCollectionNewTbcotizacionTmpPosToAttach);
            }
            tbcotizacionTmpPosCollectionNew = attachedTbcotizacionTmpPosCollectionNew;
            tbproductos.setTbcotizacionTmpPosCollection(tbcotizacionTmpPosCollectionNew);
            tbproductos = em.merge(tbproductos);
            for (TbcotizacionPos tbcotizacionPosCollectionOldTbcotizacionPos : tbcotizacionPosCollectionOld) {
                if (!tbcotizacionPosCollectionNew.contains(tbcotizacionPosCollectionOldTbcotizacionPos)) {
                    tbcotizacionPosCollectionOldTbcotizacionPos.setProducto(null);
                    tbcotizacionPosCollectionOldTbcotizacionPos = em.merge(tbcotizacionPosCollectionOldTbcotizacionPos);
                }
            }
            for (TbcotizacionPos tbcotizacionPosCollectionNewTbcotizacionPos : tbcotizacionPosCollectionNew) {
                if (!tbcotizacionPosCollectionOld.contains(tbcotizacionPosCollectionNewTbcotizacionPos)) {
                    Tbproductos oldProductoOfTbcotizacionPosCollectionNewTbcotizacionPos = tbcotizacionPosCollectionNewTbcotizacionPos.getProducto();
                    tbcotizacionPosCollectionNewTbcotizacionPos.setProducto(tbproductos);
                    tbcotizacionPosCollectionNewTbcotizacionPos = em.merge(tbcotizacionPosCollectionNewTbcotizacionPos);
                    if (oldProductoOfTbcotizacionPosCollectionNewTbcotizacionPos != null && !oldProductoOfTbcotizacionPosCollectionNewTbcotizacionPos.equals(tbproductos)) {
                        oldProductoOfTbcotizacionPosCollectionNewTbcotizacionPos.getTbcotizacionPosCollection().remove(tbcotizacionPosCollectionNewTbcotizacionPos);
                        oldProductoOfTbcotizacionPosCollectionNewTbcotizacionPos = em.merge(oldProductoOfTbcotizacionPosCollectionNewTbcotizacionPos);
                    }
                }
            }
            for (TbcotizacionTmpPos tbcotizacionTmpPosCollectionOldTbcotizacionTmpPos : tbcotizacionTmpPosCollectionOld) {
                if (!tbcotizacionTmpPosCollectionNew.contains(tbcotizacionTmpPosCollectionOldTbcotizacionTmpPos)) {
                    tbcotizacionTmpPosCollectionOldTbcotizacionTmpPos.setProducto(null);
                    tbcotizacionTmpPosCollectionOldTbcotizacionTmpPos = em.merge(tbcotizacionTmpPosCollectionOldTbcotizacionTmpPos);
                }
            }
            for (TbcotizacionTmpPos tbcotizacionTmpPosCollectionNewTbcotizacionTmpPos : tbcotizacionTmpPosCollectionNew) {
                if (!tbcotizacionTmpPosCollectionOld.contains(tbcotizacionTmpPosCollectionNewTbcotizacionTmpPos)) {
                    Tbproductos oldProductoOfTbcotizacionTmpPosCollectionNewTbcotizacionTmpPos = tbcotizacionTmpPosCollectionNewTbcotizacionTmpPos.getProducto();
                    tbcotizacionTmpPosCollectionNewTbcotizacionTmpPos.setProducto(tbproductos);
                    tbcotizacionTmpPosCollectionNewTbcotizacionTmpPos = em.merge(tbcotizacionTmpPosCollectionNewTbcotizacionTmpPos);
                    if (oldProductoOfTbcotizacionTmpPosCollectionNewTbcotizacionTmpPos != null && !oldProductoOfTbcotizacionTmpPosCollectionNewTbcotizacionTmpPos.equals(tbproductos)) {
                        oldProductoOfTbcotizacionTmpPosCollectionNewTbcotizacionTmpPos.getTbcotizacionTmpPosCollection().remove(tbcotizacionTmpPosCollectionNewTbcotizacionTmpPos);
                        oldProductoOfTbcotizacionTmpPosCollectionNewTbcotizacionTmpPos = em.merge(oldProductoOfTbcotizacionTmpPosCollectionNewTbcotizacionTmpPos);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = tbproductos.getId();
                if (findTbproductos(id) == null) {
                    throw new NonexistentEntityException("The tbproductos with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Tbproductos tbproductos;
            try {
                tbproductos = em.getReference(Tbproductos.class, id);
                tbproductos.getId();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The tbproductos with id " + id + " no longer exists.", enfe);
            }
            Collection<TbcotizacionPos> tbcotizacionPosCollection = tbproductos.getTbcotizacionPosCollection();
            for (TbcotizacionPos tbcotizacionPosCollectionTbcotizacionPos : tbcotizacionPosCollection) {
                tbcotizacionPosCollectionTbcotizacionPos.setProducto(null);
                tbcotizacionPosCollectionTbcotizacionPos = em.merge(tbcotizacionPosCollectionTbcotizacionPos);
            }
            Collection<TbcotizacionTmpPos> tbcotizacionTmpPosCollection = tbproductos.getTbcotizacionTmpPosCollection();
            for (TbcotizacionTmpPos tbcotizacionTmpPosCollectionTbcotizacionTmpPos : tbcotizacionTmpPosCollection) {
                tbcotizacionTmpPosCollectionTbcotizacionTmpPos.setProducto(null);
                tbcotizacionTmpPosCollectionTbcotizacionTmpPos = em.merge(tbcotizacionTmpPosCollectionTbcotizacionTmpPos);
            }
            em.remove(tbproductos);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Tbproductos> findTbproductosEntities() {
        return findTbproductosEntities(true, -1, -1);
    }

    public List<Tbproductos> findTbproductosEntities(int maxResults, int firstResult) {
        return findTbproductosEntities(false, maxResults, firstResult);
    }

    private List<Tbproductos> findTbproductosEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Tbproductos.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Tbproductos findTbproductos(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Tbproductos.class, id);
        } finally {
            em.close();
        }
    }

    public int getTbproductosCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Tbproductos> rt = cq.from(Tbproductos.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
